package com.yfjin.gl.filter;

import android.content.Context;
import android.opengl.GLES20;
import android.util.Log;

import com.yfjin.gl.R;

import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.FloatBuffer;


public class ViewFilter2 {

    protected int mProgramId;

    // 浮点类型占用的字节数
    private final static int BYTES_PER_FLOAT = 4;

    //在数组中，一个顶点需要3个来描述其位置，需要3个偏移量
    private static final int COORDS_PER_VERTEX = 3;
    private static final int COORDS_PER_COLOR = 0;
    //在数组中，描述一个顶点，总共的顶点需要的偏移量。这里因为只有位置顶点，所以和上面的值一样
    private static final int TOTAL_COMPONENT_COUNT = COORDS_PER_VERTEX + COORDS_PER_COLOR;
    //一个点需要的byte偏移量。
    private static final int STRIDE = TOTAL_COMPONENT_COUNT * BYTES_PER_FLOAT;

    //顶点的坐标系
    private static float TRIANGLE_COORDS[] = {
            //Order of coordinates: X, Y, Z
            0.5f, 0.5f, 0.0f, // top
            -0.5f, -0.5f, 0.0f, // bottom left
            0.5f, -0.5f, 0.0f   // bottom right
    };

    private FloatBuffer mVertexFloatBuffer;

    public ViewFilter2(Context context) {
        String vertexShader = OpenGLUtils.readRawTextFile(context, R.raw.view_vert);
        String fragShader = OpenGLUtils.readRawTextFile(context, R.raw.view_frag2);
        //编译-》连接-》运行
        mProgramId = OpenGLUtils.loadProgram(vertexShader, fragShader);
        initData();
    }

    private void initData() {
        //通过nio ByteBuffer把设置的顶点数据加载到内存
        mVertexFloatBuffer = ByteBuffer
                .allocateDirect(TRIANGLE_COORDS.length * BYTES_PER_FLOAT) //需要多少字节内存
                .order(ByteOrder.nativeOrder())//大小端排序
                .asFloatBuffer()
                .put(TRIANGLE_COORDS);//设置数据


        //0.先使用这个program?这一步应该可以放到onCreate中进行
        GLES20.glUseProgram(mProgramId);
        //--------------------------------------------------------------------------
        //--------------------------------------------------------------------------
        mVertexFloatBuffer.position(0);
        int aPosition = GLES20.glGetAttribLocation(mProgramId, "a_Position");
        GLES20.glVertexAttribPointer(
                aPosition,//aPosition attribute 句柄
                COORDS_PER_VERTEX,//coords 用几个偏移描述一个顶点/在数组中占用的位数
                GLES20.GL_FLOAT,//顶点数据类型
                false,
                STRIDE,//一个顶点需要多少个字节偏移
                mVertexFloatBuffer//分配的buffer  元数据
        );
        //开启顶点着色器的attribute
        GLES20.glEnableVertexAttribArray(aPosition);
        //--------------------------------------------------------------------------
        //RGBA
        final float[] TRIANGLE_COLOR = new float[]{0,1,0,0};
        int aColor = GLES20.glGetUniformLocation(mProgramId, "v_Color");
        GLES20.glUniform4fv(
                aColor,
                1,
                TRIANGLE_COLOR,
                0
        );

    }


    public void onDraw() {
        Log.i("123123", "OnDraw");
        //清屏
        GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);
        //绘制三角形.
        //draw arrays的几种方式 GL_TRIANGLES三角形
        //GL_TRIANGLE_STRIP三角形带的方式(开始的3个点描述一个三角形，后面每多一个点，多一个三角形)
        //GL_TRIANGLE_FAN扇形(可以描述圆形)
        GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, TRIANGLE_COORDS.length / COORDS_PER_VERTEX);
    }

}


